package collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

public class StreamApiDemo3 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            list.add(random.nextInt(100));
        }
        System.out.println(list);

        /*
        常见的终端环节:
        min:获取流中最小元素
        max:获取流中最大元素
        anyMatch:判断流中是否存在元素可以lambda的条件
        allMatch:判断流中的元素是否都满足lambda的条件
        noneMatch:判断流中的元素是否都不满足lambda的条件
        collect:将流中的元素收集到新集合中
        reduce:积累操作
         */

        //获取集合中的最小值
//        Optional<Integer> min = list.stream().min((e1,e2)->e1-e2);
//        int n = min.get();
//        System.out.println(n);

        int min = list.stream().min((e1,e2)->e1-e2).get();
        System.out.println(min);

        //获取最大值
        int max = list.stream().max((e1,e2)->e1-e2).get();
        System.out.println(max);

        //判断集合中是否存在偶数
        //anyMatch:只要流中有一个元素满足条件则返回true
        boolean anyMatch = list.stream().anyMatch(e->e%2==0);
        System.out.println("是否存在偶数:" + anyMatch);

        //判断集合中是否所有元素都是奇数
        boolean allMatch = list.stream().allMatch(e->e%2!=0);
        System.out.println("是否都是奇数:" + allMatch);

        //是否所有元素都>50
        boolean noneMatch = list.stream().noneMatch(e->e<=50);
        System.out.println("是否都不小于等于50:" + noneMatch);

        /*
            reduce:积累操作
            将集合每个元素最终积累为1个值
            例如:
            集合元素:[e1,e2,e3,e4,e5]
            reduce会进行若干次，第一次会用第一个元素和第二个元素进行操作
            将操作结果与第三个元素操作，再将操作结果与第四个元素操作直到与
            最后一个元素操作
            e1-e2 reduce 得到结果:e
            e-e3  reduce 得到结果:e
            e-e4  reduce 得到加过:e
            ...
            e-en  reduce 得到最终结果:e


            将集合[a,b,c,d,e]所有元素累加，得到结果
            a+b+c+d+e=?
             list.stream().reduce((e1, e2)->e1+e2);
             第一次:e1+e2 -> n
                   a  b
             第二次:e1+e2 -> n
                   n  c
             第三次:e1+e2 -> n
                   n  d
         */

        int num = list.stream().reduce((e1,e2)->e1+e2).get();
        System.out.println(num);


    }
}